# 学员信息在线管理

import types

#全局变量
#模拟账号
GAccountList = [{'Number':'0001','Password':'123456','Name':'张三','Balance':1000,'IsLock':False},
                {'Number':'0002','Password':'654321','Name':'黎明','Balance':200,'IsLock':False},
                {'Number':'0003','Password':'123999','Name':'王五','Balance':3003.2,'IsLock':False}]



def is_int(strInput):
    '''
        检查输入字符串是否INT
        return  ：bool
    '''
#begin is_int
    try:
        int(strInput) #强制转换int
        return True
    except ValueError: #非int的字符串会抛出异常
        return False
#end is_int

#读取账号信息
def loadAccountByNumber(accountNumber):
    '''
        根据账号名查询对应密码
        accountNumber : 账号名称
        return(dict) :账号对应字典,不符合要求的返回空字典
        return(str)  : 退出或重启的命令
    '''
#begin loadAccountByNumber

    if(len(accountNumber) == 0): #首先验证输入的账号是否为空
        print("账号名不能为空,请重新输入！")
        return {}
    tempList = [acc for acc in GAccountList if(acc['Number'] == accountNumber)] #推导出账号对应的字典
    if(len(tempList) != 1): #不存在账号时返回空字典
        print("账号输入错误,请重新输入！")
        return {} #返回空结果
    else:
        return tempList[0] #返回合格结果

#end loadAccountByNumber

def Login():
    '''
        Login Fucntion
        return(dict) : 账号对应字典,不符合要求的返回空字典
        return(str)  : 退出或重启的命令
    '''
#begin login

    temp_current_account = {} #初始化临时变量
    while (temp_current_account == {}): #循环临时账号,若为空则继续      
        accountNumber =   input("请输入需要操作的本行账号:")
        if(str.lower(accountNumber) == 'q'):#检查输入是否为Q
            return "q"
        else:
            temp_current_account =  loadAccountByNumber(accountNumber)
    
    if(temp_current_account['IsLock']): #检查账号是否锁死
        print("密码错误超过3次,无法登陆,请联系管理员解锁！")
        return "r"
    i = 3 #初始化密码可输入次数
    while(i > 0): 
        password = input("请输入密码：") 
        if(password == temp_current_account['Password']): #验证密码
            print("登陆成功！")
            break        
        i -=1
        if(i == 0): #如密码输入三次均为错误,则死锁
            print("密码输入错误已达3次,本账号将会锁死,请联系管理员解锁！")
            temp_current_account['IsLock'] = True
            return "r" #返回重启命令
        else:
            print("密码输入错误,您还有 %d 次输入机会。" % i)
    return temp_current_account #返回当前用户

#end login

def showMainTable(currentAccount):
    '''
        显示主界面与操作
        return(str) : 退出或重启的命令
    '''
#begin showMainTable

    controlID = "" #初始化操作ID
    while True:
        print("=" * 7," {0} 先生/女士,您好请选择所需要的服务 ".format(currentAccount["Name"]),"=" * 7)
        print("{0:1} {1:13} {2:15}".format("","1. 查询余额","2. 修改密码"))
        print("{0:1} {1:15} {2:15}".format("","3. 取款","4. 存款"))
        print("若需要退出系统,请输入‘q’,然后回车...") 
        controlID = input("请输入需要的服务序号：")
        if(is_int(controlID)): #检测是否输入是否int
            cid = int(controlID)
            if(1 <= cid <= 4): #是否符合功能要求
                if(cid == 1): #查询余额
                    print("{:2}先生/女士,您当前账户的余额为{:,}元".format(currentAccount["Name"],currentAccount["Balance"]))
                elif(cid == 2): #修改密码
                    i = 3 #初始化原密码输入次数
                    while(i > 0):
                        ori_password = input("请输入原密码：")
                        if(ori_password == currentAccount['Password']): #检查是否与原密码一致
                            new_password = input("请输入新密码(密码必须为6位数正整数)：") 
                            while(len(new_password) != 6 or (not is_int(new_password))): #循环检测新密码是否符合格式
                                new_password = input("新密码不符合格式,请重新输入新密码(密码必须为6位数正整数)：")

                            re_password = input("请再次输入新密码：")

                            if(new_password == re_password): #再次输入新密码的验证操作
                                currentAccount['Password'] = new_password
                                print("密码修改成功,系统将会退出,请重新登陆系统。") #修改成功,重启试验新密码 
                            else:
                                print("新密码验证失败,本次密码修改将失效。请重新登陆系统。") #千辛万苦修改的新密码居然还可以确认错误,果断重启
                            break        
                        i -=1
                        if(i == 0): #原密码输入错误一样会被锁死
                            print("原密码输入错误已达3次,本账号将会锁死,请联系管理员解锁！")
                            currentAccount['IsLock'] = True
                        else:
                            print("原密码输入错误,您还有 %d 次输入机会。" % i)                    
                    controlID = "r" #返回重启操作命令
                elif(cid == 3):#取款
                    out_money = ""
                    while(out_money == ""): #如果是非法金额,则不断要求输入
                       out_money = input("请输入取款金额(本ATM系统只能接受100元的面额交易)：")
                       if(is_int(out_money)): #检查取款金额是否为int
                           if(int(out_money) % 100 > 0): #取款金额是否为100的倍数
                               print("请输非常抱歉，本模拟ATM系统只能接受100元的面额交易,请重新输入。")
                               out_money = ""
                       else: 
                           print("请输入正确取款面额！")
                           out_money = ""

                    if(float(out_money) > float(currentAccount['Balance'])): #检查账户是否够钱
                        print("当前余额不足，您的余额为：{:,} ，本次交易将失效。".format(currentAccount["Balance"]))
                    else:
                        currentAccount['Balance'] -= float(out_money) #终于可以取钱,不容易..
                        print("交易成功,本次取款金额为{:,}元,当前账号余额为：{:,}元，请取款~".format(out_money,currentAccount["Balance"]))
                else: #存款
                    in_money = ""
                    while(in_money == ""): #如果是非法金额,则不断要求输入
                        in_money = input("请输入存款金额(本ATM系统只能接受100元的面额交易)：")
                        if(is_int(in_money)):
                            if(int(in_money) % 100 > 0):#存款金额是否为100的倍数...或..不存
                                print("请输非常抱歉，本模拟ATM系统只能接受100元的面额交易,请重新输入。")
                                in_money = ""
                        else:
                            print("请输入正确的存款面额！")
                            in_money = ""
                    currentAccount['Balance'] += float(in_money) #把存款金额添加进账户
                    print("交易成功,本次存入金额为{:,}元,当前账号余额为：{:,}".format(in_money,currentAccount["Balance"]))
                input("按回车继续! ")
            else:
                input("请输入正确的服务序号，按回车继续! ")            
        elif(str.lower(controlID) != "q"): #非法字符q除外
            input("请输入正确的服务序号，按回车继续! ")

        if(str.lower(controlID) == "q"): #q则退出
            print("系统即将退出。。")
            break
        elif(str.lower(controlID) == "r"):#r则重启
            print("系统即将重启。。")
            break
    
    return controlID
#end showMainTable


# 输出初始界面
def init():
    '''
        初始化ATM登陆界面
    '''
#begin init
    print("=" * 12," 欢迎使用模拟银行ATM系统 ","=" * 12)
    print("如需退出,请按‘q’再回车")
    account = Login()#先执行登陆操作
    
    if(isinstance(account,dict)):
        if(account != {}):
            result = showMainTable(account)
            if(str.lower(result) == 'r'): #如果重启,则递归..
                init()
    elif(str.lower(account) == 'r'):
        init()
    print("非常感谢使用本次模拟银行ATM系统,欢迎再次使用,再见~")
#end init

#Testing
init()


